gusucode.com > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM源码程序 > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM\stprtool\svm\oaosmo2.m

    function [model] = oaosmo2( data, labels, ker, arg, C, tol, verb)
% OAOSMO2 One-Agains-One multi-class decomposition solved by SMO L2.
% [model] = oaosmo2( data, labels, ker, arg, C, tol, verb)
%
% Inputs:
%  data [dim x N] training patterns
%  labels [1 x N] labels of training patterns
%  ker [string] kernel, see 'help kernel'.
%  arg [...] argument of given kernel, see 'help kernel'.
%  C [real] trade-off between margin and training error.
%  tol  [1 x 1] stopping condition.
%  verb [int] if 1 then progress info is displayed. 
% 
% Output:
%  model [struct] contains found O-A-O SVM classifier.
% 

%  Statistical Pattern Recognition Toolbox, Vojtech Franc, Vaclav Hlavac
%  (c) Czech Technical University Prague, http://cmp.felk.cvut.cz
%  Written Vojtech Franc (diploma thesis) 02.11.1999, 13.4.2000
%
%  Modifications
%   3-Jun-2002, V.Franc

[dim,num_data ] = size(data);
num_classes = max(labels);

model.name = 'One-Against-One, SVM classifier';

model.num_classes = num_classes;
model.num_rules = num_classes*(num_classes-1)/2;
model.rule = cell(model.num_rules);

model.SVM.C = C;
model.SVM.kernel = ker;
model.SVM.arg = arg;

model.trn_data = data;
model.trn_labels = labels;
model.kercnt=0;

trn_errors = zeros(1, model.num_rules);
sv=zeros(1,num_data);

cnt=0;

% builds num_classes*(num_classes-1)/2 1-a-1 classfication rules
model.btime=cputime;
for class1=1:num_classes-1,
  for class2=class1+1:num_classes,
  
    cnt=cnt+1;
    
    if verb ==1,
      fprintf(1, 'building rule %d-%d (%d of %d) ...', ...
        class1,class2, cnt, model.num_rules );
    end

    model.rule{cnt}.class1 = class1;
    model.rule{cnt}.class2 = class2;
    
    % takes data from class1 and class2
    model.rule{cnt}.data_inx = find(labels==class1 | labels==class2);
    model.rule{cnt}.labels = labels(model.rule{cnt}.data_inx);
    model.rule{cnt}.labels(find(model.rule{cnt}.labels==class1))=1;
    model.rule{cnt}.labels(find(model.rule{cnt}.labels==class2))=2;
    
    [Alpha,bias,nsv,trnerr,margin,kercnt]=smo2(...
        data(:,model.rule{cnt}.data_inx), model.rule{cnt}.labels,...
        ker, arg, C, 1e-3, tol);

    model.rule{cnt}.Alpha = Alpha;
    model.rule{cnt}.bias = bias;
    model.rule{cnt}.kercnt = kercnt;
    model.rule{cnt}.margin = margin;
    model.rule{cnt}.nsv = length(find(Alpha~=0));
    model.rule{cnt}.trnerr = trnerr;
    model.kercnt = model.kercnt + kercnt;  
    
    trn_errors(cnt) = trnerr;
    sv(model.rule{cnt}.data_inx(find(Alpha ~=0)))=1;
    
    if verb ==1,
      fprintf(1,'done\n');
    end
  end
end

model.btime=cputime-model.btime;
model.trnerr = mean( trn_errors);
model.nsv = length(find(sv ~=0));

return;

%EOF